<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head><meta HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=UTF-8"/>
<title>Session机制</title><link href="../zdoc.css" rel="stylesheet" type="text/css"/><link href="../_rs/site.css" rel="stylesheet" type="text/css"/><script src="../_rs/jquery.js" language="Javascript"></script><script src="../_rs/site.js" language="Javascript"></script><script src="../_rs/z.js" language="Javascript"></script>
</head>
<body><a name="top"></a>
<div class="zdoc_header">Session机制</div>
<div class="zdoc_author"><em>By:</em><b>wendal</b><a href="mailto:wendal1985@gmail.com">&lt;wendal1985@gmail.com&gt;</a></div>
<div class="zdoc_body">
<ul class="zdoc_index_table">
<li>
<div class="zdoc_folder"><span class="num">1</span><a href="#Session机制是什么?">Session机制是什么?</a></div>
<ul>
<li>
<div><span class="num">1.1</span><a href="#Session有很多种,_例如:">Session有很多种, 例如:</a></div>
</li>
</ul>
</li>
<li>
<div><span class="num">2</span><a href="#涉及到的注解和接口">涉及到的注解和接口</a></div>
</li>
<li>
<div class="zdoc_folder"><span class="num">3</span><a href="#对自定义SessionProvider实现的提醒">对自定义SessionProvider实现的提醒</a></div>
<ul>
<li>
<div><span class="num">3.1</span><a href="#如果你打算实现分布式的Session:">如果你打算实现分布式的Session:</a></div>
</li>
<li>
<div><span class="num">3.2</span><a href="#减少在Session中存放的内容">减少在Session中存放的内容</a></div>
</li>
</ul>
</li>
<li>
<div><span class="num">4</span><a href="#哪里有现成的实现?">哪里有现成的实现?</a></div>
</li>
</ul>
<div class="hr"><b></b></div>
<h1><a name="Session机制是什么?"></a>Session机制是什么?</h1>
<div style="float:right;"><a href="#top">Top</a></div>
<p>Session即HttpSession对象,是维护客户端/服务器端的身份识别机制之一</p>
<p>默认情况下,单机使用,并不需要特别的Session机制</p>
<p>但,如果是集群,或者你想用Redis/Memcached等存放Session,那么就需要自定义Session了</p>
<h2><a name="Session有很多种,_例如:"></a>Session有很多种, 例如:</h2>
<div style="float:right;"><a href="#top">Top</a></div>
<p>*容器本身提供的(tomcat/jetty/jboss/weblogic等都自带跨JVM的Session,功能强大但存放的对象必须实现Serializable*自行实现的,针对性高,可控性高</p>
<p>如果是容器提供的Session机制,那么大部分情况下都是对应用透明的,所以nutz也没什么可以做的</p>
<p>对于控制欲很强,业务不是非常复杂的,自定义Session肯定是首选啦</p>
<div class="hr"><b></b></div>
<h1><a name="涉及到的注解和接口"></a>涉及到的注解和接口</h1>
<div style="float:right;"><a href="#top">Top</a></div>
<p>@SessionBy -- 定义在主模块(全局的,难道你还想每个子模块一种?!),就是为了说明下一个接口的对象如何生成SessionProvider -- 过滤器式的Session提供者</p>
<p>最废品的一个SessionBy和SessionProvider实现</p>
<pre>@SessionBy(NopSessionProvider.class)
public class MainModule {} //其他的果断不理啦

public class NopSessionProvider extend AbstractSessionProvider {

	public HttpSession createSession(HttpServletRequest req,
								 HttpServletResponse resp,
								 ServletContext servletContext) {
		//使用容器原生的Session实现 == 等于什么都没做
		return req.getSession(true);
		// 你可以根据req的cookie判断是新建一个你自己的Session对象还是从某种集合中取出相应的Session对象
		// 例如用memcached,jdbc,redis来存放键值
	}

}
</pre>
<p></p>
<div class="hr"><b></b></div>
<h1><a name="对自定义SessionProvider实现的提醒"></a>对自定义SessionProvider实现的提醒</h1>
<div style="float:right;"><a href="#top">Top</a></div>
<h2><a name="如果你打算实现分布式的Session:"></a>如果你打算实现分布式的Session:</h2>
<div style="float:right;"><a href="#top">Top</a></div>
<p></p>
<ul type="disc">
<li>所有写操作(setXXX)都要持久化到数据库或其他独立的存储空间(所有机器均能访问的)中</li>
<li>所有读操作(getXXX)都应该从数据库或其他独立的存储空间中获取</li>
</ul>
<h2><a name="减少在Session中存放的内容"></a>减少在Session中存放的内容</h2>
<div style="float:right;"><a href="#top">Top</a></div>
<p></p>
<ul type="disc">
<li>Session的读写,肯定比原生Session慢,因为原生Session仅仅同一个JVM中的Map</li>
<li>注意数据同步的问题</li>
</ul>
<div class="hr"><b></b></div>
<h1><a name="哪里有现成的实现?"></a>哪里有现成的实现?</h1>
<div style="float:right;"><a href="#top">Top</a></div>
<p>ztask项目,有一个基于mongo的实现</p>
</div>
<div class="zdoc_footer"><em>By:</em><b>wendal</b><a href="mailto:wendal1985@gmail.com">&lt;wendal1985@gmail.com&gt;</a></div>
</body>
</html>